iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
Software Development

Datomic,內建事件溯源的資料庫。系列 第 6

先從 Datalog 談起 -- part 1 (edn)

  • 分享至 

  • xImage
  •  

對資料庫有點經驗的讀者應該會心想:「資料庫有這麼多的細節,還是先看看 Datalog 語言如何吧?如果看起來沒有什麼道理而且很難寫,還要花時間繼續研究下去嗎?」

Datalog 是語法高度一致且容易學習的查詢語言,趕快來體驗看看吧。

今天來學 Datalog

今天來學 Datalog 是個互動式的 Datalog 教學網站 (免費且不用註冊!),可以讓學習者一邊解題目、一邊對答案的方式,在互動之中大概掌握 Datalog 查詢語言。 讀者可以連上這個網站,試著挑戰解題看看。

這邊我會先帶著讀者,很快地走訪一遍這個網站。(註1)

edn 格式 (extensible data notation)

網站裡的第一課就先談 edn 格式。

首先,Datomic 裡的 Datalog 是用 edn 格式來撰寫,所以它跟 SQL 不同,並不是字串型態的查詢語言,而是資料結構型態的查詢語言

那什麼是 edn 格式呢?簡單一點的話,可以把它想成是 json 的加強版本,其中,明顯的加強地方有三個:

  1. json 只有映射 (map) 與陣列 (list) 兩種容器型態。edn 有四種:映射(map), 向量(vector), 串列(list), 集合(set)。
  2. json 裡的 map 的"鍵"是使用一般的字串,而 edn 的話, map 裡最常用的"鍵"則是 keyword 資料型態。 (註2)
  3. json 沒有專門用來表示時間的專用資料型態。edn 則可以使用人類肉眼可讀的時間表示法,比方說:#inst "2013-02-26"來表示時間。

就先對 edn 理解到這邊吧,其它的 edn 細節不深入了解也不妨礙學習 Datalog 。

用一個真實的 Datalog 查詢來說明 edn 格式:

[:find ?title
 :where 
 [_ :movie/title ?title]]

在這個例子裡:

  1. :find:move/title 是keyword 資料型態
  2. ?title 是符號資料型態。
  3. [_ :movie/title ?title] 裡的 [] 是個向量 (vector) 的容器資料型態。

這個例子,如果寫成”幾乎”等價的 SQL 的話,可以寫成:

SELECT title
FROM movie-table;

立刻開始在網站上解題吧!

  • 解題時,把答案寫在 Query 的框裡,並且按下 Run Query 按鈕,就可以對答案。
    解題

  • 答案如果正確時,左上角會變綠色喔。

  • 遇到題目解不出來時,則可以按下圖右方紅圈處的 I give up! ,看解答。
    解不出來

註:

  1. 今天來學 Datalog
  2. 許多程式語言並沒有 keyword 資料型態,這邊多解釋一下:

以 json 來講,表示一個映射

{"name": "John"
 "age": 15}

同樣子的結構,在 edn 會表示成:

{:name: "John"
 :age: 15}

其中,:name 和 :age 就是 keyword 資料型態。用 keyword 這樣子專用資料型態來表示映射裡的"鍵",有讓語意更加清晰的作用。

其它資源:

  1. 歡迎訂閱PruningSuccess電子報,主要談論軟體開發、資料處理、資料分析等議題。
  2. 歡迎加入Clojure社群

上一篇
Datomic 所屬的資料庫類別
下一篇
先從 Datalog 談起 -- part 2 (basic queries)
系列文
Datomic,內建事件溯源的資料庫。25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言